package NO13;

/**
 * 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
 * @author swg
 */
public class Power {
	//传统方法，时间复杂度为O(n)
	public static double power(double base, int exponent){
	       double result = 1.0;
	       if(exponent == 0){
	           return 1;
	       }else if(exponent > 0){
	           while(exponent > 0){
	               result *= base;
	               exponent--;
	           }
	           return result;
	       }else{
	    	   if(base == 0)
	    		   throw new RuntimeException("分母不能为0啊");
	           int temp = java.lang.Math.abs(exponent);
	           while(temp > 0){
	               result *= base;
	               temp--;
	           }
	           return 1/result;
	       }
	}
	
	//优化
	public static double power2(double base, int exponent){
		//盛放结果的参数，初始化为1
		double result = 1;
		//给指数一个副本
		int index = exponent;
		//给底数一个副本
		double curr = base;
		//当指数为0时直接返回1
		if(exponent == 0){
			return 1;
		//当指数小于0时，先判断分母是不是0，然后先将指数取反
		}else if(exponent < 0){
			if(base == 0){
				throw new RuntimeException("指数为负数的情况下，分母不能为0");
			}
			index = -exponent;
		}
		
		//对指数进行位的判断
		while(index != 0){
			if((index&1) == 1){
				result *= curr;
			}
			//移位-》每次都要翻倍
			curr *= curr;
			index >>= 1;
		}
		return exponent > 0?result:1/result;
	}
	
	public static void main(String[] args) {
		System.out.println(power(2, -3));
		System.out.println(power2(2, -3));
	}
}
